/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package ca.weblite.netbeans.mirah.cc; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import javax.swing.ImageIcon; import javax.swing.text.BadLocationException; import javax.swing.text.JTextComponent; import javax.swing.text.StyledDocument; import org.netbeans.api.editor.completion.Completion; import org.netbeans.lib.editor.codetemplates.api.CodeTemplate; import org.netbeans.lib.editor.codetemplates.api.CodeTemplateManager; import org.netbeans.spi.editor.completion.CompletionItem; import org.netbeans.spi.editor.completion.CompletionTask; import org.netbeans.spi.editor.completion.support.CompletionUtilities; import org.openide.util.Exceptions; import org.openide.util.ImageUtilities; /** * * @author shannah */ public class MirahConstructorCompletionItem implements CompletionItem { private int caretOffset; private int length; private Constructor method; private static ImageIcon fieldIcon = new ImageIcon(ImageUtilities.loadImage("ca/weblite/netbeans/mirah/1391571312_application-x-ruby.png")); private static Color fieldColor = Color.decode("0x0000B2"); public MirahConstructorCompletionItem(Constructor m, int caretOffset, int len) { this.method = m; this.caretOffset = caretOffset; this.length = len; } @Override public void defaultAction(JTextComponent jtc) { CodeTemplateManager mgr = CodeTemplateManager.get(jtc.getDocument()); StringBuilder sb = new StringBuilder(); sb.append("new"); Class[] ptypes = method.getParameterTypes(); if ( ptypes.length > 0 ){ sb.append("("); for ( int i=0; i<ptypes.length; i++){ sb.append("${PARAM"); sb.append(i); sb.append(" instanceof=\""); sb.append(ptypes[i].getCanonicalName()); sb.append("\" default=\"nil\"}"); if ( i < ptypes.length-1 ){ sb.append(", "); } } sb.append(")"); } String tplStr = sb.toString(); CodeTemplate tpl = mgr.createTemporary(tplStr); try { StyledDocument doc = (StyledDocument) jtc.getDocument(); if ( length > 0 ){ doc.remove(caretOffset, length); } tpl.insert(jtc); //doc.insertString(caretOffset, tpl., null); //This statement will close the code completion box: Completion.get().hideAll(); } catch (BadLocationException ex) { Exceptions.printStackTrace(ex); } } private String formatMethod(Constructor m){ StringBuilder sb = new StringBuilder(); sb.append("new"); Class[] ptypes = m.getParameterTypes(); if ( ptypes.length == 0 ){ return sb.toString(); } sb.append("("); for ( Class c : ptypes ){ sb.append(c.getSimpleName()); sb.append(","); } sb.deleteCharAt(sb.length()-1); sb.append(")"); return sb.toString(); } private String formatMethodForList(Constructor m){ StringBuilder sb = new StringBuilder(); sb.append("new"); Class[] ptypes = m.getParameterTypes(); if ( ptypes.length > 0 ){ sb.append("("); for ( Class c : ptypes ){ sb.append(c.getSimpleName()); sb.append(", "); } sb.delete(sb.length()-2, sb.length()-1); sb.append(")"); } //sb.append(":"); //sb.append(m.getReturnType().getSimpleName()); return sb.toString(); } @Override public void processKeyEvent(KeyEvent ke) { } @Override public int getPreferredWidth(Graphics graphics, Font font) { return CompletionUtilities.getPreferredWidth(formatMethodForList(method), null, graphics, font); } @Override public void render(Graphics g, Font font, Color color, Color color1, int width, int height, boolean selected) { CompletionUtilities.renderHtml(fieldIcon, formatMethodForList(method), null, g, font, (selected ? Color.white : fieldColor), width, height, selected); } @Override public CompletionTask createDocumentationTask() { return null; } @Override public CompletionTask createToolTipTask() { return null; } @Override public boolean instantSubstitution(JTextComponent jtc) { return false; } @Override public int getSortPriority() { return 0; } @Override public CharSequence getSortText() { return method.getName(); } @Override public CharSequence getInsertPrefix() { return method.getName(); } }